﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using MDK;
using MDK.Physics;
using ZedGraph;

namespace ThompsonScatteringLib
{
    public class Thompson : GraphicPrimitive
    {
        #region Конструкторы
        public Thompson()
            : base(0, 0, new Size())
        {
            this.Needs = ExperimentNeeds.Normal;
            AddParametersToTemplate();
        }

        public Thompson(int Left, int Top, Size Size)
            : base(Left, Top, Size)
        {
            this.Needs = ExperimentNeeds.Normal; // нужды

            // передаём размеры
            this.Left = Left;
            this.Top = Top;

            this.Size = Size;

            //создаём список по умолчанию
            AddParametersToTemplate();
        }
        #endregion

        MovingParticle a = new MovingParticle();  // альфа-частица
        MovingParticle p = new MovingParticle();  // протон


        #region Методы взаимодействия с главным модулем

        public override ExperimentAbout GetAbout()
        {
            return new ExperimentAbout("ThompsonScatteringLib", "Моделирование рассеяния альфа-частиц на протоне",
                                        "Задача данной модели - показать, что при рассеянии альфа-частиц на протонах\nпоявляется максимальный угол");  
        }

        private void AddParametersToTemplate()
        {
            ParameterListTemplate = new ParameterList();

            
            ParameterListTemplate.Add("Скорость афльфа-частицы", "V", 1);
        }

        public override void SetParameters(ParameterList pList)
        {
            a.vx = pList["V"];
        }


        public override ParameterList GetParameters()
        {
            ParameterList RetList = new ParameterList();

            RetList.Add("Скорость афльфа-частицы", "V", this.a.vx);

            return RetList;
        }

        public override PointPairList GetResults()
        {
            // todo: возвращаем результаты для статистики
            return new PointPairList();
        }

        Random rnd = new Random();
        /// <summary>
        /// Метод рисования
        /// </summary>
        /// <param name="e"></param>
        public override void Draw(System.Windows.Forms.PaintEventArgs e)
        {
            InitParticles(); // инициализируем частицы

            int b = rnd.Next(-50, 50); // прицельное расстояние
            a.x = p.x - this.Size.Width / 3;
            a.y = p.y + b;

            e.Graphics.DrawLine(Pens.BlueViolet, 0, p.y + b, this.Size.Width, p.y + b);

            for (int i = 0; i < 500; i++)
            {
                a.Move((Particle)p);
                p.Move((Particle)a);

                e.Graphics.DrawEllipse(Pens.Red, a.x - 5, a.y - 5, 10, 10);
                e.Graphics.DrawEllipse(Pens.Blue, p.x -2, p.y-5, 5, 5);
            }

        }

        /// <summary>
        /// Метод для инициализации стартовых параметров частиц
        /// </summary>
        void InitParticles()
        {
            p.x = this.Left + this.Size.Width / 2;
            p.y = this.Top + this.Size.Height / 2;

            p.Q = 1;
            a.Q = 2;

            p.m = 938;
            a.m = 3752;

        }

        #endregion
    }
}
